package com.sky.service;

import com.sky.dto.AdjustmentCreateDTO;
import com.sky.dto.TransactionPageQueryDTO;
import com.sky.dto.WithdrawalPageQueryDTO;
import com.sky.dto.CreateWithdrawalDTO;
import com.sky.dto.ApproveWithdrawalDTO;
import com.sky.dto.RejectWithdrawalDTO;
import com.sky.result.PageResult;
import com.sky.vo.IdVO;
import com.sky.vo.TransactionRecordVO;
import com.sky.vo.TransactionSummaryVO;
import com.sky.vo.WithdrawalVO;

import java.io.ByteArrayInputStream;

/**
 * 财务管理服务接口：交易流水、汇总、调整、提现与导出。
 * 与前端 `financeApi.ts` 保持契约一致。
 */
public interface FinanceService {

    /**
     * 交易流水分页查询。
     * @param dto 查询参数（商户、方向、类别、时间范围、页码页长等）
     * @return 分页结果（records+total），records 中元素类型为 TransactionRecordVO
     */
    PageResult getTransactionPage(TransactionPageQueryDTO dto);

    /**
     * 交易汇总查询（总收入、总支出、余额）。
     * @param dto 查询参数（商户、时间范围等）
     * @return 汇总视图对象
     */
    TransactionSummaryVO getTransactionSummary(TransactionPageQueryDTO dto);

    /**
     * 创建一条调整记录（正负均可）。
     * @param dto 调整创建参数
     * @return 新建记录的 ID
     */
    IdVO createAdjustment(AdjustmentCreateDTO dto);

    /**
     * 提现申请分页查询。
     * @param dto 查询参数（商户、状态、时间范围、页码页长等）
     * @return 分页结果（records+total），records 中元素类型为 WithdrawalVO
     */
    PageResult getWithdrawalPage(WithdrawalPageQueryDTO dto);

    /**
     * 创建一条提现申请。
     * @param dto 提现创建参数
     * @return 新建提现记录的 ID
     */
    IdVO createWithdrawal(CreateWithdrawalDTO dto);

    /**
     * 根据主键查询提现详情。
     * @param id 主键 ID
     * @return 提现详情视图
     */
    WithdrawalVO getWithdrawalById(Long id);

    /**
     * 审批通过提现申请。
     * @param dto 审批参数
     * @return 操作结果描述
     */
    String approveWithdrawal(ApproveWithdrawalDTO dto);

    /**
     * 驳回提现申请。
     * @param dto 驳回参数
     * @return 操作结果描述
     */
    String rejectWithdrawal(RejectWithdrawalDTO dto);

    /**
     * 导出财务数据为 CSV。
     * @param dto 查询参数（同流水分页）
     * @return CSV 二进制流（内存输入流）
     */
    ByteArrayInputStream exportFinanceData(TransactionPageQueryDTO dto);
}